import NPGA
import IndividuoMultiobjetivo
import Test1
import matplotlib.pyplot as ppl
import Resultado
import AnimacionResultados


def MostrarPoblacion(poblacion, rank):
  ppl.xlim((-0.1,1))
  ppl.ylim((0, 4))
  for individuo in poblacion:
    (f1, f2) = individuo.GetFitnesVals()
    ppl.plot(f1, f2, marker='o', color='r')
    label = str(rank[individuo])
    ppl.annotate(
        label, 
        xy = (f1, f2), xytext = (20, 20),
        textcoords = 'offset points', ha = 'right', va = 'bottom',
        bbox = dict(boxstyle = 'round,pad=0.5', fc = 'yellow', alpha = 0.5),
        arrowprops = dict(arrowstyle = '->', connectionstyle = 'arc3,rad=0'))

  ppl.show(block = False)


def GenResutls(poblacion, iteracion):
  return [Resultado.Resultado(indiv.GetFitnesVals()[0], indiv.GetFitnesVals()[1], indiv.currentRank, iteracion) for indiv in poblacion]


# Parametros del algoritmo
iteraciones = 250
numPoblacion = 100
m = 30
bitsParaCodificacion = 200
maxValX = 1.0
radio = 0.48
funcionTest = Test1.FuncionesTest4
isTest4 = True
isTest5 = False
tournamentSize = 5
setComparacion = 10
alfa = 0.5
useRealCodification = True
useRankAsDomination = True

showAnim = False

resultados = []

ga = NPGA.NPGA(m, bitsParaCodificacion, maxValX, radio, tournamentSize, setComparacion, alfa, useRealCodification, useRankAsDomination)
ga.GenerarPoblacion(funcionTest, numPoblacion, isTest4, isTest5)

for it in range(iteraciones):
    poblacion = ga.Step()
    if showAnim:
      resultados.append(GenResutls(poblacion, it)) # Para la animacion



ga.rank = NPGA.ParetoRank(ga.poblacion)
MostrarPoblacion(ga.poblacion, ga.rank)

#if showAnim:
AnimacionResultados.GO(resultados)

print "Ya"








